home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 20 / Cream of the Crop 20 (Terry Blount) (1996).iso / program / 3dview12.zip / VESA3D.CPP < prev    next >
C/C++ Source or Header  |  1996-05-30  |  11KB  |  297 lines

  1. #include <string.h>
  2. #include <sys\stat.h>
  3. #include <sys\types.h>
  4. #include <fcntl.h>
  5. #include <io.h>
  6. #include <math.h>
  7.  
  8. #include "defines.hpp"
  9.  
  10. #include "vesa.hpp"
  11. #include "3d.hpp"
  12. #include "dpmi.hpp"
  13. #include "vesa3d.hpp"
  14.  
  15. void *VESA3D_ZBuffer;
  16. DWORD *VESA3D_ZBuffer_MULTable;
  17. WORD VESA3D_ZBuffer_Selector;
  18.  
  19. struct VESA3D_BMPHeader {
  20.    char Check [2];
  21.    DWORD FileSize;
  22.    DWORD Reserved;
  23.    DWORD BitmapStart;
  24.    DWORD ImageSize;
  25.    DWORD Columns;
  26.    DWORD Rows;
  27.    WORD Planes;
  28.    WORD BitsPerPix;
  29.    DWORD Compression;
  30.    DWORD CompressionSize;
  31.    DWORD XScale;
  32.    DWORD YScale;
  33.    DWORD Colors;
  34.    DWORD VIPColors;
  35. };
  36.  
  37. WORD VESA3D_LoadTexture( char *File, VESA3D_Texture &TEX ) {
  38.  
  39.     int FileHandle;
  40.     static struct VESA3D_BMPHeader Header;
  41.  
  42.     FileHandle = open( File, O_RDONLY | O_BINARY );
  43.     if ( FileHandle == -1 ) return 1;
  44.  
  45.     read( FileHandle, &Header, sizeof( VESA3D_BMPHeader ) );
  46.     TEX.TDX = Header.Columns;
  47.     TEX.TDY = Header.Rows;
  48.     if ( ( Header.Columns & 3 ) != 0 )
  49.         Header.Columns = ( Header.Columns >> 2 << 2 ) + 4;
  50.  
  51.     TEX.PAL = new char [1024];
  52.     read( FileHandle, TEX.PAL, 1024 );
  53.  
  54.     TEX.TEXPtr = DWORD( new char [ (Header.Rows) * Header.Columns ] );
  55.     TEX.TEXLength = Header.Rows * Header.Columns;
  56.     lseek( FileHandle, Header.BitmapStart, SEEK_SET );
  57.     read( FileHandle, (void*)(TEX.TEXPtr), Header.Rows * Header.Columns );
  58.     close( FileHandle );
  59.     
  60.     TEX.MULTable = new DWORD [Header.Rows];
  61.     for ( int j=0; j < Header.Rows; j++ ){
  62.         TEX.MULTable[j] = TEX.TEXPtr + j*Header.Columns;
  63.     };
  64.     
  65.     return 0;
  66. };
  67.  
  68. void VESA3D_SetTexturePalette( VESA3D_Texture &TEX, WORD N ) {
  69.     for( WORD i = 1; i <= N; i++ ){
  70.         VESA_SetColor8B( i, TEX.PAL[4*i+2], TEX.PAL[4*i+1], TEX.PAL[4*i] );
  71.     };
  72. };
  73.  
  74. void VESA3D_ConvertTexture( VESA3D_Texture TEX ) {
  75.     char MOVEPAL [256] = {0};
  76.     char *SAVEPAL = new char [1024];
  77.     char *TEXBytePtr = (char*)(TEX.TEXPtr);
  78.     char PALCount = 1;
  79.  
  80.     for ( int i=0; i <= 1023; i++ )
  81.         SAVEPAL[i] = TEX.PAL[i];
  82.    
  83.     for ( i=0; i < TEX.TEXLength; i++ ) {
  84.         if ( MOVEPAL[*TEXBytePtr] == 0 ) {
  85.             MOVEPAL[*TEXBytePtr] = PALCount;
  86.             ((DWORD*)(TEX.PAL))[PALCount] = ((DWORD*)(SAVEPAL))[*TEXBytePtr];
  87.             PALCount++;
  88.         };
  89.         *TEXBytePtr = MOVEPAL[*TEXBytePtr];
  90.         TEXBytePtr++;
  91.     };
  92. };
  93.  
  94. WORD VESA3D_PageWrite = 0;
  95. WORD VESA3D_PageShow  = 0;
  96. WORD VESA3D_WriteSelector;
  97.  
  98. void VESA3D_FlipPageWrite() {
  99.     VESA3D_PageWrite ^= 1;
  100.     VESA3D_WriteSelector = ( VESA3D_PageWrite == 0 ? VESA_Selector : VESA_SecondScreen_Sel );
  101. };
  102.  
  103. void VESA3D_FlipPageShow() {
  104.     VESA3D_PageShow ^= 1;
  105.     if ( VESA3D_PageShow == 0 ) {
  106.         VESA_SetDisplayStart( 0, 0 );
  107.     }
  108.     else {
  109.         VESA_SetDisplayStart( 0, WORD( VESA_SecondScreen_StartY ) );
  110.         // VESA_SetDisplayStart( WORD(VESA_XResolution), 0 );
  111.     };
  112. };
  113.  
  114. void VESA3D_GouraudTriangle( long X1, long Y1, DWORD C1, long X2, long Y2, DWORD C2,
  115.                       long X3, long Y3, DWORD C3 ) {
  116.     VESA_FilledTriangleG8B( X1, Y1, X2, Y2, X3, Y3, C1, C2, C3, VESA3D_WriteSelector );
  117. };
  118.  
  119. void VESA3D_FlatTriangle( long X1, long Y1, long X2, long Y2, long X3, long Y3, DWORD C ) {
  120.     VESA_FilledTriangle8B( X1, Y1, X2, Y2, X3, Y3, C, VESA3D_WriteSelector );
  121. };
  122.  
  123. void VESA3D_TexturedTriangle( long X1, long Y1, long TX1, long TY1,
  124.                         long X2, long Y2, long TX2, long TY2,
  125.                         long X3, long Y3, long TX3, long TY3, void *TEX ) {
  126.     VESA_FilledTriangleTex8BC( X1, Y1, X2, Y2, X3, Y3, TX1, TY1, TX2, TY2, TX3, TY3,
  127.                                 DWORD((*((VESA3D_Texture*)TEX)).MULTable),
  128.                                 VESA3D_WriteSelector );
  129. };
  130.  
  131. void VESA3D_TexturedTriangleZBuf( long X1, long Y1, long TX1, long TY1, double Z1,
  132.                                    long X2, long Y2, long TX2, long TY2, double Z2,
  133.                                    long X3, long Y3, long TX3, long TY3, double Z3,
  134.                                    void *TEX ) {    
  135.     VESA_FilledTriangleTexZ8BC( X1, Y1, X2, Y2, X3, Y3, TX1, TY1, TX2, TY2, TX3, TY3,
  136.                                 DWORD( Z1 * 256 * 65536 ),
  137.                                 DWORD( Z2 * 256 * 65536 ),
  138.                                 DWORD( Z3 * 256 * 65536 ),
  139.                                 DWORD((*((VESA3D_Texture*)TEX)).MULTable),
  140.                                 VESA3D_ZBuffer_Selector,
  141.                                 VESA3D_WriteSelector );
  142. };
  143.  
  144. void VESA3D_FlatTriangleZBuf( long X1, long Y1, double Z1, long X2, long Y2, double Z2,
  145.                                long X3, long Y3, double Z3, DWORD C ) {
  146.     VESA_FilledTriangleZBuf8BC( X1, Y1, X2, Y2, X3, Y3,
  147.                                 DWORD( Z1 * 256 * 65536 ),
  148.                                 DWORD( Z2 * 256 * 65536 ),
  149.                                 DWORD( Z3 * 256 * 65536 ),
  150.                                 C, VESA3D_ZBuffer_Selector,
  151.                                 VESA3D_WriteSelector );
  152. };
  153.  
  154. void VESA3D_GouraudTriangleZBuf( long X1, long Y1, double Z1, DWORD C1,
  155.                                long X2, long Y2, double Z2, DWORD C2,
  156.                                long X3, long Y3, double Z3, DWORD C3 ) {
  157.     VESA_FilledTriangleGZBuf8BC( X1, Y1, X2, Y2, X3, Y3,
  158.                                  DWORD( Z1 * 256 * 65536 ),
  159.                                  DWORD( Z2 * 256 * 65536 ),
  160.                                  DWORD( Z3 * 256 * 65536 ),
  161.                                  C1, C2, C3,
  162.                                  VESA3D_ZBuffer_Selector,
  163.                                  VESA3D_WriteSelector );
  164. };
  165.  
  166. double VESA3D_ShadeMul, VESA3D_ShadeSub = 0;
  167.  
  168. DWORD VESA3D_DistColor( double D, DWORD C ) {
  169.     return C + DWORD( ( D - VESA3D_ShadeSub ) * VESA3D_ShadeMul );
  170. };
  171.  
  172. void VESA3D_New3DTexQuad( long PA, long PB, long PC, long PD, VESA3D_Texture &TEX,
  173.                           _3D_Triangle_SideTyp S, _3D_Triangle_Typ T ) {
  174.     long AX = 0;
  175.     long AY = TEX.TDY-1;
  176.     long BX = TEX.TDX-1;
  177.     long BY = TEX.TDY-1;
  178.     long CX = TEX.TDX-1;
  179.     long CY = 0;
  180.     long DX = 0;
  181.     long DY = 0;
  182.     long MX = TEX.TDX/2;
  183.     long MY = TEX.TDY/2;
  184.     long PM = _3D_NewPoint( (_3D_Point_GetX(PA)+_3D_Point_GetX(PB)+
  185.                              _3D_Point_GetX(PC)+_3D_Point_GetX(PD))/4,
  186.                             (_3D_Point_GetY(PA)+_3D_Point_GetY(PB)+
  187.                              _3D_Point_GetY(PC)+_3D_Point_GetY(PD))/4,
  188.                             (_3D_Point_GetZ(PA)+_3D_Point_GetZ(PB)+
  189.                              _3D_Point_GetZ(PC)+_3D_Point_GetZ(PD))/4 );
  190.     _3D_NewObject( new _3D_Triangle( PA,AX,AY,PB,BX,BY,PM,MX,MY,&TEX,S,RectFourTri,T ) );
  191.     _3D_NewObject( new _3D_Triangle( PB,BX,BY,PC,CX,CY,PM,MX,MY,&TEX,S,RectFourTri,T ) );
  192.     _3D_NewObject( new _3D_Triangle( PC,CX,CY,PD,DX,DY,PM,MX,MY,&TEX,S,RectFourTri,T ) );
  193.     _3D_NewObject( new _3D_Triangle( PD,DX,DY,PA,AX,AY,PM,MX,MY,&TEX,S,RectFourTri,T ) );
  194.    
  195. };
  196.  
  197. void VESA3D_New3DGourQuad( long PA, long PB, long PC, long PD, DWORD C,
  198.                            _3D_Triangle_SideTyp S) {
  199.     _3D_NewObject( new _3D_Triangle( PA, PB, PC, C, S, Rectangle ) );
  200.     _3D_NewObject( new _3D_Triangle( PC, PD, PA, C, S, Rectangle ) );
  201. };
  202.  
  203. void VESA3D_New3DZBufQuad( long PA, long PB, long PC, long PD, DWORD C,
  204.                             _3D_Triangle_SideTyp S ) {
  205.     _3D_NewObject( new _3D_Triangle( PA, PB, PC, C, S, Rectangle, FlatShadedZBuf ) );
  206.     _3D_NewObject( new _3D_Triangle( PC, PD, PA, C, S, Rectangle, FlatShadedZBuf ) );
  207. };
  208.  
  209. void VESA3D_New3DGourZBufQuad( long PA, long PB, long PC, long PD, DWORD C,
  210.                                 _3D_Triangle_SideTyp S ) {
  211.     _3D_NewObject( new _3D_Triangle( PA, PB, PC, C, S, Rectangle, GouraudShadedZBuf ) );
  212.     _3D_NewObject( new _3D_Triangle( PC, PD, PA, C, S, Rectangle, GouraudShadedZBuf ) );
  213. };
  214.  
  215. void VESA3D_New3DQuad( long PA, long PB, long PC, long PD, DWORD C,
  216.                                 _3D_Triangle_SideTyp S, _3D_Triangle_Typ T ) {
  217.     _3D_NewObject( new _